package cn.tedu.design;/**
 * @Author 金帮嘉诚 @Date 2021-06-24 星期四 10:31
 */
/*本类用于测试单例设计模式实现方案二：懒汉式--面试重点*/

import jdk.Exported;

import java.lang.annotation.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * 知识点
 * a用的时候才创建
 */
public class Singleton2 {
    public static void main(String[] args) {

        MYSingle2 s1 = MYSingle2.getSingle2();
        MYSingle2 s2 = MYSingle2.getSingle2();

        System.out.println("(s2==s1) = " + (s2 == s1));
        System.out.println("s1 = " + s1);
        System.out.println("s2 = " + s2);

    }
}

/*问题：程序中有共享资源single2，并且多条（3句）语句操作了共享资源
 * 所以single2在多线程下会有数据安全隐患
 * 解决方案：同步代码块
 * 【加锁，范围是操作共享资源的所有代码】
 * 解决方案2：同步方法
 * 【如果一个方法中的所有代码均需要被同步，那我们可以把这个方法设置成同步方法】*/

class MYSingle2 extends Object{
    //
    private MYSingle2() {
    }

    //定义 不创建
    //懒汉式，明显的区别就是此处不赋值，没有创建对象
    private static MYSingle2 single2;
    private static Object object = new Object();

    //能用同步方法
    synchronized public static MYSingle2 getSingle2() {

//        synchronized (this) {//cannot be referenced from a static context
        synchronized (object) {
            if (single2 == null) {
                single2 = new MYSingle2();
            }
            return single2;
        }
    }
}




